package cn.chengpengper.seckill.common.lock;

import java.util.concurrent.TimeUnit;

/**
 * @author chengpeng.hu
 */
public interface DistributedLock {

    /**
     * 尝试加锁
     *
     * @param waitTime  获取锁的等待时间
     * @param leaseTime 锁释放时间
     * @param unit      时间单位
     * @return 是否获取锁
     * @throws InterruptedException 中断异常
     */
    boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;

    boolean tryLock();

    /**
     * 加锁
     *
     * @param leaseTime 锁释放时间
     * @param unit      时间单位
     */
    void lock(long leaseTime, TimeUnit unit);

    /**
     * 释放锁
     */
    void unlock();

    /**
     * 是否加锁
     *
     * @return 是否加锁
     */
    boolean isLocked();

    /**
     * 判断锁是否被指定线程持有
     *
     * @param threadId 线程ID
     * @return 是否持有锁
     */
    boolean isHeldByThread(long threadId);

    /**
     * 判断锁是否被当前线程持有
     *
     * @return 是否持有锁
     */
    boolean isHeldByCurrentThread();
}
